#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;

const int N = 1600;
vector<int> g[N];
bool flag[N];
int dp[N][2];
int n, root;

void init(int n)
{
    for(int i = 0; i < n; ++i) g[i].clear();
}

void add(int a, int b){
    g[a].push_back(b);
}

void dfs(int root)
{
    if(g[root].empty())
        dp[root][0] = 0, dp[root][1] = 1;

    dp[root][1] = 1;
    for(auto nd: g[root])
    {
        dfs(nd);
        dp[root][0] += dp[nd][1];
        dp[root][1] += min(dp[nd][1], dp[nd][0]);
    }
}


int main()
{
    while(cin >> n)
    {
        getchar();
        // cout << n << endl;
        init(n);
        memset(flag, 0, sizeof flag);
        memset(dp, 0, sizeof dp);
        for(int i = 0; i < n; ++i)
        {
            // cout << i << endl;
            string s;
            getline(cin, s);
            // cout << s << endl;
            istringstream in(s);
            string tmp;
            in >> tmp;
            // cout << tmp.substr(0, 1) << endl;
            int h = stoi(tmp.substr(0, tmp.find(':')));
            // // cout << "---" << endl;
            int l = tmp.find('(');
            int r = tmp.find(')');
            int nd = stoi(tmp.substr(l + 1, r - l - 1));
            // // cout << "---" << endl;
            for(int i = 0; i < nd; ++i)
            {
                in >> tmp;
                int tnd = stoi(tmp);
                add(h, tnd);
                flag[tnd] = true;
            }

        }
        for(int i = 0; i < n; ++i)
            if(!flag[i])
            {
                root = i;
                break;
            }
            dfs(root);

        cout << min(dp[root][0], dp[root][1]) << endl;
    }
    return 0;
}

